/**
 ******************************************************************************
 * @file           : bsp_iic_gpio.h
 * @brief          : Software I2C Driver Header File (STM32F4xx)
 ******************************************************************************
 * @attention
 *
 * 软件模拟I2C驱动头文件
 * GPIO模拟I2C协议，引脚任意配置
 *
 ******************************************************************************
 */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __BSP_IIC_GPIO_H
#define __BSP_IIC_GPIO_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include <stdint.h>
#include "./BSP/IIC_GPIO/bsp_iic_gpio_config.h"

/* Exported types ------------------------------------------------------------*/

/**
 * @brief IIC_GPIO错误码枚举
 */
typedef enum
{
    IIC_GPIO_OK = 0,                /*!< 成功 */
    IIC_GPIO_ERROR_PARAM,           /*!< 参数错误 */
    IIC_GPIO_ERROR_TIMEOUT,         /*!< 超时 */
    IIC_GPIO_ERROR_NACK,            /*!< 接收方不应答 */
    IIC_GPIO_ERROR_BUS              /*!< 总线错误 */
} IIC_GPIO_Error_e;

/**
 * @brief I2C应答信号枚举
 */
typedef enum
{
    IIC_ACK = 0,                    /*!< 应答 */
    IIC_NACK                        /*!< 非应答 */
} IIC_Ack_e;

/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
/* Exported variables --------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/

/* 初始化函数 */
void iic_gpio_init(void);

/* 基础时序函数 */
void iic_gpio_start(void);
void iic_gpio_stop(void);
void iic_gpio_send_ack(void);
void iic_gpio_send_nack(void);
IIC_Ack_e iic_gpio_wait_ack(void);

/* 字节读写函数 */
void iic_gpio_send_byte(uint8_t data);
uint8_t iic_gpio_read_byte(IIC_Ack_e ack);

/* 寄存器读写函数 */
uint8_t iic_gpio_write_reg(uint8_t dev_addr, uint8_t reg_addr, uint8_t data);
uint8_t iic_gpio_read_reg(uint8_t dev_addr, uint8_t reg_addr, uint8_t *data);

/* 多字节读写函数 */
uint8_t iic_gpio_write_bytes(uint8_t dev_addr, uint8_t reg_addr, uint8_t *buf, uint16_t len);
uint8_t iic_gpio_read_bytes(uint8_t dev_addr, uint8_t reg_addr, uint8_t *buf, uint16_t len);

/* 设备检测 */
uint8_t iic_gpio_check_device(uint8_t dev_addr);

/* 状态查询函数 */
IIC_GPIO_Error_e iic_gpio_get_last_error(void);

/* 调试接口 */
void iic_gpio_print_status(void);

#ifdef __cplusplus
}
#endif

#endif /* __BSP_IIC_GPIO_H */
